package com.itheima.service.cargo.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itheima.dao.cargo.ContractDao;
import com.itheima.dao.cargo.ContractProductDao;
import com.itheima.domain.cargo.Contract;
import com.itheima.domain.cargo.ContractProduct;
import com.itheima.domain.cargo.ContractProductExample;
import com.itheima.service.cargo.ContractProductService;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

@Service
public class ContractProductServiceImpl implements ContractProductService {

    @Autowired
    private ContractProductDao contractProductDao;

    @Autowired
    private ContractDao contractDao;

    public void save(ContractProduct contractProduct) {
        //1、得到的参数是货物contractProduct，设置id，设置公司信息（在controller设置）
        //2、通过contractProduct.cnumber*contractProduct.price得到货物的金额
        double amount = 0.0d;
        if (contractProduct.getCnumber() != null && contractProduct.getPrice() != null) {
            amount = contractProduct.getCnumber() * contractProduct.getPrice();
        }
        //3、给货物实体类设置货物的金额
        contractProduct.setAmount(amount);
        //4、通过合同service.findById(contractProduct.getContractId)得到合同的实体类
        Contract contract = contractDao.selectByPrimaryKey(contractProduct.getContractId());
        //5、计算合同主表上的货物数量：通过合同主表原来的数量 + 本次增加货物的数量
        //6、设置合同的货物数量
        if (contract.getProNum() != null) {
            contract.setProNum(contract.getProNum() + contractProduct.getCnumber());
        }
        //7、计算合同主表上的总金额： 通过合同主表原来总金额 + 本次增加货物的总金额
        //8、设置合同的总金额
        if (contract.getTotalAmount() != null) {
            contract.setTotalAmount(contract.getTotalAmount() + amount);
        } else {
            contract.setTotalAmount(amount);
        }
        //9、保存货物到数据库
        contractProductDao.insertSelective(contractProduct);
        //10、更新合同到数据库
        contractDao.updateByPrimaryKeySelective(contract);
    }

    public void update(ContractProduct contractProduct) {
        //1、得到的参数是货物contractProduct，设置id，设置公司信息（在controller设置）
        //2、通过contractProduct.cnumber*contractProduct.price得到货物的金额
        double amount = 0.0d;
        if (contractProduct.getCnumber() != null && contractProduct.getPrice() != null) {
            amount = contractProduct.getCnumber() * contractProduct.getPrice();
        }
        //3、给货物实体类设置货物的金额
        contractProduct.setAmount(amount);
        //4、通过合同service.findById(contractProduct.getContractId)得到合同的实体类
        Contract contract = contractDao.selectByPrimaryKey(contractProduct.getContractId());
        //5、通过contractProduct.getId()查找原来货物的实体类
        ContractProduct oldConPro = contractProductDao.selectByPrimaryKey(contractProduct.getId());
        //6、计算合同主表上的货物数量：通过合同主表原来的数量 - 原来货物的数量 + 本次货物的数量
        //7、设置合同的货物数量
        contract.setProNum(contract.getProNum() - oldConPro.getCnumber() + contractProduct.getCnumber());
        //8、计算合同主表上的总金额： 通过合同主表原来总金额 - 原来货物的总金额 + 本次货物的总金额
        //9、设置合同的总金额
        contract.setTotalAmount(contract.getTotalAmount() - oldConPro.getAmount() + contractProduct.getAmount());
        //10、保存货物到数据库
        contractProductDao.updateByPrimaryKeySelective(contractProduct);
        //11、更新合同到数据库
        contractDao.updateByPrimaryKeySelective(contract);
    }

    public void delete(String id) {
        //1、传入的参数是id，查询货物的实体类
        ContractProduct contractProduct = contractProductDao.selectByPrimaryKey(id);
        //2、通过货物实体类里contractId查找合同的实体类
        Contract contract = contractDao.selectByPrimaryKey(contractProduct.getContractId());
        //3、计算合同的货物数量：通过合同本身的货物数量 - 本次要删除的货物数量
        //4、设置合同的货物数量
        contract.setProNum(contract.getProNum() - contractProduct.getCnumber());
        //5、计算合同的总金额：通过合同本身的总金额 - 本次要删除的货物金额
        //6、设置合同的总金额
        contract.setTotalAmount(contract.getTotalAmount() - contractProduct.getAmount());
        //7、更新合同到数据库
        contractDao.updateByPrimaryKeySelective(contract);
        //8、通过id删除货物
        contractProductDao.deleteByPrimaryKey(id);
    }

    public ContractProduct findById(String id) {
        return contractProductDao.selectByPrimaryKey(id);
    }

    public PageInfo<ContractProduct> findAll(ContractProductExample example, int page, int size) {
        PageHelper.startPage(page, size);
        List<ContractProduct> list = contractProductDao.selectByExample(example);
        return new PageInfo<>(list);
    }
}
